R paketleri
Neden paketler var


Paketleri nereden bulabiliriz
Kendi paket evrenini oluştur
R paket yükleme
install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")
Paket çağırma
require(tidyverse)
require(jmv)
require(questionr)
library(summarytools)
library(gganimate)
Veriyi görüntüleme
Veriyi görüntüleme
library(nycflights13)
summary(flights)
Veriyi değiştirme
Veriyi kod ile değiştirelim
Veriyi eklentilerle değiştirme
Basit tanımlayıcı istatistikler
summary()
mean
median
min
max
sd
table()
library(readr)
irisdata <- read_csv("data/iris.csv")
jmv::descriptives(
data = irisdata,
vars = "Sepal.Length",
splitBy = "Species",
freq = TRUE,
hist = TRUE,
dens = TRUE,
bar = TRUE,
box = TRUE,
violin = TRUE,
dot = TRUE,
mode = TRUE,
sum = TRUE,
sd = TRUE,
variance = TRUE,
range = TRUE,
se = TRUE,
skew = TRUE,
kurt = TRUE,
quart = TRUE,
pcEqGr = TRUE)
# install.packages("scatr")
scatr::scat(
data = irisdata,
x = "Sepal.Length",
y = "Sepal.Width",
group = "Species",
marg = "dens",
line = "linear",
se = TRUE)
DataExplorer
library(DataExplorer)
DataExplorer::create_report(df)

Grafikler
# library(ggplot2)
# library(mosaic)
# mPlot(irisdata)
descr(tobacco, style = 'rmarkdown')
print(descr(tobacco), method = 'render', table.classes = 'st-small')
dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)
print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')
A beginner kit for #rstats The Landscape of R Packages for Automated Exploratory Data Analysis https://journal.r-project.org/archive/2019/RJ-2019-033/
@article{RJ-2019-033, author = {Mateusz Staniak and Przemysław Biecek}, title = {{The Landscape of R Packages for Automated Exploratory Data Analysis}}, year = {2019}, journal = {{The R Journal}}, doi = {10.32614/RJ-2019-033}, url = {https://journal.r-project.org/archive/2019/RJ-2019-033/index.html} }

Sonraki Konular
- RStudio ile GitHub kullanımı
- R Markdown ve R Notebook ile tekrarlanabilir rapor
- Hipotez testleri
Libraries Used
citation("tidyverse")
citation("foreign")
citation("tidylog")
citation("janitor")
citation("jmv")
citation("tangram")
citation("finalfit")
citation("summarytools")
citation("ggstatplot")
citation("readxl")
İletişim
Completed on 2019-12-20 13:52:40.
Serdar Balci, MD, Pathologist
drserdarbalci@gmail.com
https://rpubs.com/sbalci/CV
https://sbalci.github.io/
https://github.com/sbalci
https://twitter.com/serdarbalci
CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", wd, " \n git add . \n git commit --message '", CommitMessage, "' \n git push origin master \n", sep = "")
system(command = gitCommand, intern = TRUE
)
LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmluc3RpdHV0ZTogIltzZXJkYXJiYWxjaS5jb21dKGh0dHBzOi8vd3d3LnNlcmRhcmJhbGNpLmNvbSkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgeGFyaW5nYW46Om1vb25fcmVhZGVyOgogICAgbGliX2RpcjogbGlicwogICAgbmF0dXJlOgogICAgICBiZWZvcmVJbml0OiBbIm1hY3Jvcy5qcyIsICJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiXQogICAgICBoaWdobGlnaHRTdHlsZTogZ2l0aHViCiAgICAgIGhpZ2hsaWdodExpbmVzOiB0cnVlCiAgICAgIGNvdW50SW5jcmVtZW50YWxTbGlkZXM6IGZhbHNlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHJldmVhbGpzOjpyZXZlYWxqc19wcmVzZW50YXRpb246CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGhpZ2hsaWdodDoga2F0ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzUnCiAgaHRtbF9kb2N1bWVudDoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgo8IS0tIE9wZW4gYWxsIGxpbmtzIGluIG5ldyB0YWItLT4gIAo8YmFzZSB0YXJnZXQ9Il9ibGFuayIvPiAgIAoKPCEtLSBHbyB0byB3d3cuYWRkdGhpcy5jb20vZGFzaGJvYXJkIHRvIGN1c3RvbWl6ZSB5b3VyIHRvb2xzIC0tPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3M3LmFkZHRoaXMuY29tL2pzLzMwMC9hZGR0aGlzX3dpZGdldC5qcyNwdWJpZD1yYS01YmMzNjkwMGE0MDUwOTBiIj4gIAo8L3NjcmlwdD4KCjwhLS0gWyFbXShodHRwOi8vcmVzLmNsb3VkaW5hcnkuY29tL2R5ZDkxMWttaC9pbWFnZS91cGxvYWQvZl9hdXRvLHFfYXV0bzpiZXN0L3YxNTMwMTEzMDc3L0ltYWdlXzJfdmZ5NDhiLnBuZyldKGh0dHBzOi8vd3d3LmRhdGFjYW1wLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2RhdGEtc2NpZW5jZS1waXRmYWxscykgLS0+CgoKYGBge3Igc2V0dXAgZ2xvYmFsIGNodW5rIHNldHRpbmdzLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgltZXNzYWdlID0gRkFMU0UsCgl3YXJuaW5nID0gRkFMU0UsCgljb21tZW50ID0gTkEsCglpbmNsdWRlID0gRkFMU0UsCgl0aWR5ID0gVFJVRQopCmBgYAoKCiMgUiBuZXJlZGUga3VsbGFuxLFsxLFyCgotIFZlcmkgZMO8emVubGVtZQotIMSwc3RhdGlzdGlrIGFuYWxpegotIFdlYiBzYXlmYXPEsSBoYXrEsXJsYW1hIChTdGF0aWsvRGluYW1paykKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLyAgCmh0dHBzOi8va2V2aW5ydWUuc2hpbnlhcHBzLmlvL2lzZWUtc2hpbnktY29udGVzdC8KLSBTdW51bSBoYXrEsXJsYW1hIChidSBzdW51bSkKLSBQcm9ncmFtbGFtYQpodHRwczovL3NlcmRhcmJhbGNpLm5ldGxpZnkuY29tL3BhdGh0d2VldHMvCi0gT3RvbWF0aWssIHBlcmlvZGlrIHZlIHRla3JhcmxhbmFiaWxpciByYXBvciBoYXrEsXJsYW1hCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9BdXRvSm91cm5hbFdhdGNoL0dhbGxibGFkZGVyUmVjZW50Lmh0bWwKLSBwZGYsIGh0bWwsIHBwdCBvbHXFn3R1cm1hCi0gdGV6IHlhem1hCi0ga2l0YXAgeWF6bWEKLSBDViBvbHXFn3R1cm1hCmh0dHBzOi8vcnB1YnMuY29tL3NiYWxjaS9DViAgIAotIHBvc3RlciBoYXrEsXJsYW1hCi0gcmFwb3IgxZ9hYmxvbnUgb2x1xZ90dXJtYQotIFJvYm90IHV5Z3VsYW1hbGFyxLEgKEFydWRpbm8ga29kdSkKLSAuLi4KCgoKLS0tCgojIFIgZ2VuZXJhdGlvbgoKUiB5xLFsbGFyIGnDp2luZGUgw6dvayBmYXpsYSBkZcSfacWfaW0gZ8O2c3RlcmRpCgpodHRwczovL3Jzcy5vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvMTAuMTExMS9qLjE3NDAtOTcxMy4yMDE4LjAxMTY5LngKCiFbXShodHRwczovL3dvbC1wcm9kLWNkbi5saXRlcmF0dW1vbmxpbmUuY29tL3BiLWFzc2V0cy9qb3VybmFsLWJhbm5lcnMvMTc0MDk3MTMtMTUwMTM4NDc1NjAzNy5qcGcpCgohWzpzY2FsZSAzMCVdKGh0dHBzOi8vd29sLXByb2QtY2RuLmxpdGVyYXR1bW9ubGluZS5jb20vY21zL2F0dGFjaG1lbnQvMWE0OWMwN2ItYjU2Zi00MzI3LThlOTItNzgyN2VmNTFhN2JiL3NpZ24xMTY5LWdyYS0wMDAyLW0uanBnKQoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKHBhdGggPSAiaHR0cHM6Ly93b2wtcHJvZC1jZG4ubGl0ZXJhdHVtb25saW5lLmNvbS9jbXMvYXR0YWNobWVudC8xYTQ5YzA3Yi1iNTZmLTQzMjctOGU5Mi03ODI3ZWY1MWE3YmIvc2lnbjExNjktZ3JhLTAwMDItbS5qcGciKQpgYGAKCgotLS0KCiMgUiB5w7xrbGVtZQoKaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhjQkxFVmtucXZZCgoKIVtXaGF0IGlzIFI/XShodHRwOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1hjQkxFVmtucXZZLzAuanBnKQoKCi0tLQoKCiMjIFItcHJvamVjdAoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvCgotLS0KCiMjIFJTdHVkaW8KCgohW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2VuZ2luZS5wbmcpCgotLS0KCiMjIyBSU3R1ZGlvCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8pCgpbaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvKQoKW2h0dHBzOi8vbW9kZXJuZGl2ZS5jb20vMi1nZXR0aW5nLXN0YXJ0ZWQuaHRtbF0oaHR0cHM6Ly9tb2Rlcm5kaXZlLmNvbS8yLWdldHRpbmctc3RhcnRlZC5odG1sKQoKLS0tCgojIyMgUlN0dWRpbwoKClshW10oaHR0cDovL3d3dy11c2Vycy55b3JrLmFjLnVrL35lcjEzL1JTdHVkaW8lMjBBbmF0b215LnN2ZyldKGh0dHBzOi8vYnV6enJiZWVsaW5lLmJsb2cvMjAxOC8wNy8wNC9yc3R1ZGlvLWFuYXRvbXkvKQoKCgotLS0KCiMjIyBSU3R1ZGlvIGVrbGVudGlsZXJpCgotIERpc2NvdmVyIGFuZCBpbnN0YWxsIHVzZWZ1bCBSU3R1ZGlvIGFkZGlucwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2FkZGluc2xpc3QvUkVBRE1FLmh0bWwKCmh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vcnN0dWRpb2FkZGlucy8KCgpgYGAKZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyc3R1ZGlvL2FkZGluZXhhbXBsZXMiLCB0eXBlID0gInNvdXJjZSIpCmBgYAoKCi0tLQoKIyMgTWFjT1MgacOnaW4KCiMjIyBYMTEKCmh0dHBzOi8vd3d3LnhxdWFydHoub3JnLwoKIyMjIEphdmEgT1MKCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20va2IvZGwxNTcyCgotLS0KCgojIFIgem9yIMWfZXlsZXIgacOnaW4ga29sYXksIGtvbGF5IMWfZXlsZXIgacOnaW4gem9yCgoKLSBbUiBtYWtlcyBlYXN5IHRoaW5ncyBoYXJkLCBhbmQgaGFyZCB0aGluZ3MgZWFzeV0oaHR0cDovL3I0c3RhdHMuY29tL2FydGljbGVzL3doeS1yLWlzLWhhcmQtdG8tbGVhcm4vKQoKCi0gQXluxLEgxZ9leWkgw6dvayBmYXpsYSDFn2VraWxkZSB5YXBtYWsgbcO8bWvDvG4KClIgU3ludGF4IENvbXBhcmlzb246OkNIRUFUIFNIRUVUCgpodHRwczovL3d3dy5hbWVsaWEubW4vU3ludGF4LWNoZWF0c2hlZXQucGRmCgoKLS0tCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+PGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1JTdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I1JTdGF0czwvYT4g4oCUIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nLi4uIG5pY2UgZXhhbXBsZSBvbiB3aXRoIHRoZSBpZGVudGl0eSBtYXRyaXggYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UZWFTdGF0cz9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGVhU3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9PM0dYZFBpTTMyIj5odHRwczovL3QuY28vTzNHWGRQaU0zMjwvYT48L3A+Jm1kYXNoOyBDb2xpbiBGYXkg8J+kmCAoQF9Db2xpbkZheSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fQ29saW5GYXkvc3RhdHVzLzExMTI3NDY2MzM0Njc1MTg5Nzc/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMSwgMjAxOTwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCi0tLQoKCiMgUiBwYWtldGxlcmkKCgojIyBOZWRlbiBwYWtldGxlciB2YXIKClshW10oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvaW1nL2FwcHN0b3JlLnBuZyldKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL3NsaWRlX2RlY2suaHRtbCM3KQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SSBsb3ZlIHRoZSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPiBjb21tdW5pdHkuPGJyPlNvbWVvbmUgaXMgbGlrZSwgJnF1b3Q7b2ggaGV5IHBlZXBzLCBJIHNhdyBhIGJpZyBuZWVkIGZvciB0aGlzIG11bmRhbmUgYnV0IGRpZmZpY3VsdCB0YXNrIHRoYXQgSSBpbmZyZXF1ZW50bHkgZG8sIHNvIEkgY3JlYXRlZCBhIHBhY2thZ2UgdGhhdCB3aWxsIGxpdGVyYWxseSBzY3JhcGUgdGhlIGxhc3QgYml0cyBvZiBwZWFudXQgYnV0dGVyIG91dCBvZiB0aGUgamFyIGZvciB5b3UuIEl0JiMzOTtzIGNhbGxlZCBwYnBseXIuJnF1b3Q7PGJyPldoYXQgYSB0cmliZS48L3A+Jm1kYXNoOyBGcmFuayBFbGF2c2t5IOG0sOG1g+G1l+G1gyDhtYLhtqbhtrvhtYPKs+G1iCAoQEZyYW5rbHlfRGF0YSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9GcmFua2x5X0RhdGEvc3RhdHVzLzEwMTQxODkwOTUyOTQyOTE5Njg/cmVmX3NyYz10d3NyYyU1RXRmdyI+SnVseSAzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCjwhLS0gLS0tIC0tPgoKPCEtLSBodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvdXNlci0yMDE4LWZlYXR1cmUtd2FsbC8gLS0+CgotLS0KCiFbXShodHRwczovL2Jsb2cubWl0Y2hlbGxvaGFyYXdpbGQuY29tL2Jsb2cvMjAxOC0wNy0xMS11c2VyLTIwMTgtZmVhdHVyZS13YWxsX2ZpbGVzL2ZpbmFsLmpwZykKCi0tLQoKIyMgUGFrZXRsZXJpIG5lcmVkZW4gYnVsYWJpbGlyaXoKCi0gQXZhaWxhYmxlIENSQU4gUGFja2FnZXMgQnkgTmFtZSAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hdmFpbGFibGVfcGFja2FnZXNfYnlfbmFtZS5odG1sCgotIENSQU4gVGFzayBWaWV3cyAgCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy8KCi0gQmlvY29uZHVjdG9yICAKaHR0cHM6Ly93d3cuYmlvY29uZHVjdG9yLm9yZwoKLSBSZWNvbW1lbmRSICAKaHR0cDovL3JlY29tbWVuZHIuaW5mby8KCi0gcGtnc2VhcmNoICAKQ1JBTiBwYWNrYWdlIHNlYXJjaCAgCmh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhY3Jhbi9wa2dzZWFyY2gKCi0gQ1JBTnNlYXJjaGVyICAKaHR0cHM6Ly9naXRodWIuY29tL1Job0luYy9DUkFOc2VhcmNoZXIgIAoKLSBBd2Vzb21lIFIgIApodHRwczovL2F3ZXNvbWUtci5jb20vICAKCi0tLQoKIyMgS2VuZGkgcGFrZXQgZXZyZW5pbmkgb2x1xZ90dXIKCi0gcGtndmVyc2U6IEJ1aWxkIGEgTWV0YS1QYWNrYWdlIFVuaXZlcnNlICAKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BrZ3ZlcnNlL2luZGV4Lmh0bWwKCgotLS0KCiMjIFIgcGFrZXQgecO8a2xlbWUKCmBgYHIKaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiam12IiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygiUmNtZHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQppbnN0YWxsLnBhY2thZ2VzKCJzdW1tYXJ5dG9vbHMiKQpgYGAKCi0tLQoKIyMgUGFrZXQgw6dhxJ/EsXJtYQoKYGBgcgpyZXF1aXJlKHRpZHl2ZXJzZSkgIApyZXF1aXJlKGptdikgIApyZXF1aXJlKHF1ZXN0aW9ucikgIApsaWJyYXJ5KHN1bW1hcnl0b29scykgIApsaWJyYXJ5KGdnYW5pbWF0ZSkgIApgYGAKCgoKLS0tCgojIFIgacOnaW4geWFyZMSxbSBidWxtYQoKCmBgYHIKP21lYW4KPz9lZmV0Y2gKaGVscChtZXJnZSkKZXhhbXBsZShtZXJnZSkKUlNpdGVTZWFyY2goInNoaW55IikKYGBgCgotLS0KCi0gVmlnbmV0dGUKCiFbOnNjYWxlIDgwJV0oZmlndXJlcy92aWduZXR0ZS5wbmcpCgotLS0KCi0gUkRvY3VtZW50YXRpb24KaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnCgotIFIgUGFja2FnZSBEb2N1bWVudGF0aW9uCmh0dHBzOi8vcmRyci5pby8KCi0gR2l0SHViCgotIFN0YWNrb3ZlcmZsb3cKCmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vCgotIEdvb2dsZSB1eWd1biBhbmFodGFyIGtlbGltZQoKLS0tCgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+PGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+SG93IEkgdXNlIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IDxicj5oL3QgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9UaGVQcmFjdGljYWxEZXY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFRoZVByYWN0aWNhbERldjwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL2VyUm5URzBVanIiPnBpYy50d2l0dGVyLmNvbS9lclJuVEcwVWpyPC9hPjwvcD4mbWRhc2g7IEVtaWx5IEJvdmVlIChAZWJvdmVlMDkpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZWJvdmVlMDkvc3RhdHVzLzEwMjgwMzc1OTQ5NDc0ODU2OTY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXVndXN0IDEwLCAyMDE4PC9hPjwvYmxvY2txdW90ZT4KCgotLS0KCgohW10oZmlndXJlcy9Hb29nbGUtcGFja2FnZS1uYW1lLnBuZykKCi0tLQoKCgohW10oZmlndXJlcy9Hb29nbGUtc3RhcnQtd2l0aC1SLnBuZykKCgotIEdvb2dsZSdkYSBhcmFya2VuIGBbUl1gIHlhem1hayBkYSBpxZ9lIHlhcmF5YWJpbGl5b3IuCgoKLS0tCgotIHNlYXJjaGVyIHBhY2thZ2Ug8J+TpgoKClshW10oaHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMmYwZTJkMTgwNDdmMWI1ZjM2ZmJlYjA5YTFkMGU1NDgyMzY4ODNmLzY4NzQ3NDcwNzMzYTJmMmY2OTJlNjk2ZDY3NzU3MjJlNjM2ZjZkMmY1YTcxMzI3MjY3MzY0NzJlNjc2OTY2KV0oaHR0cHM6Ly9naXRodWIuY29tL2NvYXRsZXNzL3NlYXJjaGVyKQoKCgotLS0KCi0gQXdlc29tZSBDaGVhdHNoZWV0Cmh0dHBzOi8vZ2l0aHViLmNvbS9kZXRhaWx5YW5nL2F3ZXNvbWUtY2hlYXRzaGVldAoKaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy9kb2MvY29udHJpYi9CYWdnb3R0LXJlZmNhcmQtdjIucGRmCgpodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9yZXNvdXJjZXMvY2hlYXRzaGVldHMvCgoKLSBBd2Vzb21lIFIKCmh0dHBzOi8vZ2l0aHViLmNvbS9xaW53Zi9hd2Vzb21lLVIjcmVhZG1lCgpodHRwczovL2F3ZXNvbWUtci5jb20vCgoKLSBUd2l0dGVyCgpodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoCgotLS0KCgotIFVzZSBSZXByb2R1Y2libGUgRXhhbXBsZXMgV2hlbiBBc2tpbmcgIAoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+R290IGEgcXVlc3Rpb24gdG8gYXNrIG9uIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vU2xhY2tIUT9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AU2xhY2tIUTwvYT4gb3IgcG9zdCBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2dpdGh1Yj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AZ2l0aHViPC9hPj8gTm8gdGltZSB0byByZWFkIHRoZSBsb25nIHBvc3Qgb24gaG93IHRvIHVzZSByZXByZXg/IEhlcmUgaXMgYSAyMC1zZWNvbmQgZ2lmIGZvciB5b3UgdG8gZm9ybWF0IHlvdXIgUiBjb2RlcyBuaWNlbHkgYW5kIGZvciBvdGhlcnMgdG8gcmVwcm9kdWNlIHlvdXIgcHJvYmxlbS4gKEFuIGV4YW1wbGUgZnJvbSBhIHRhbGsgZ2l2ZW4gYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9KZW5ueUJyeWFuP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBKZW5ueUJyeWFuPC9hPikgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9ncHVHWHBGSXNYIj5waWMudHdpdHRlci5jb20vZ3B1R1hwRklzWDwvYT48L3A+Jm1kYXNoOyBaaGlZYW5nIChAemhpaWl5YW5nKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3poaWlpeWFuZy9zdGF0dXMvMTA1MzAwNjAwMzcxMTU2OTkyMD9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5PY3RvYmVyIDE4LCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKLSBLZWVwaW5nIHVwIHRvIGRhdGUgd2l0aCBSIG5ld3MgIApodHRwczovL21hc2FsbW9uLmV1LzIwMTkvMDEvMjUvdXB0b2RhdGUvICAKCi0tLQoKIyBSc3R1ZGlvIGlsZSBwcm9qZSBvbHXFn3R1cm1hCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjAwNTI2MjA3LVVzaW5nLVByb2plY3RzCgohW10oaHR0cDovL3d3dy5yc3R1ZGlvLmNvbS9pbWFnZXMvZG9jcy9wcm9qZWN0c19uZXcucG5nKQoKLS0tCgojIFJTdHVkaW8gaWxlIHZlcmkgecO8a2xlbWUKCmh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMTg2MTE5NzctSW1wb3J0aW5nLURhdGEtd2l0aC1SU3R1ZGlvCgohW10oaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVfYXR0YWNobWVudHMvMjA2Mjc3NjE4L2RhdGEtaW1wb3J0LW92ZXJ2aWV3LmdpZikKCi0tLQoKIyMgRXhjZWwKCiMjIFNQU1MKCiMjIENTVgoKCi0tLQoKIyBWZXJpeWkgZ8O2csO8bnTDvGxlbWUKCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5TcHJlYWRzaGVldCB1c2VycyB1c2luZyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPjogIHdoZXJlJiMzOTtzIHRoZSBkYXRhPzxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IHVzZXJzIHVzaW5nIHNwcmVhZHNoZWV0czogIHdoZXJlJiMzOTtzIHRoZSBjb2RlPzwvcD4mbWRhc2g7IExlb25hcmQgS2llZmVyIChAbGVua2llZmVyKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2xlbmtpZWZlci9zdGF0dXMvMTAxNTU4NzQ3NTU4MDk1NjY3Mj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5KdWx5IDcsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKLS0tCgojIFZlcml5aSBnw7Zyw7xudMO8bGVtZQoKYGBgcgpsaWJyYXJ5KG55Y2ZsaWdodHMxMykKc3VtbWFyeShmbGlnaHRzKQpgYGAKCmBgYHIKVmlldyhkYXRhKQpgYGAKCmBgYHIKZGF0YSgpCmBgYAoKCmBgYHIKaGVhZChkYXRhLCBuID0gMTApCmBgYAoKYGBgcgp0YWlsKGRhdGEpCmBgYAoKYGBgcgpnbGltcHNlKGRhdGEpCmBgYAoKCmBgYHIKc3RyKGRhdGEpCmBgYAoKCmBgYHIKc2tpbXI6OnNraW0oKQpgYGAKCi0tLQoKCiMgVmVyaXlpIGRlxJ9pxZ90aXJtZQoKIyMgVmVyaXlpIGtvZCBpbGUgZGXEn2nFn3RpcmVsaW0KCiMjIFZlcml5aSBla2xlbnRpbGVybGUgZGXEn2nFn3Rpcm1lCgohWzpzY2FsZSAzMCVdKGZpZ3VyZXMvY2hhbmdlX2RhdGEucG5nKQoKCi0tLQoKCiMjIFJTdHVkaW8gYXJhY8SxbMSxxJ/EsXlsYSByZWNvZGUKCipxdWVzdGlvbnIqIHBha2V0aSBrdWxsYW7EsWxhY2FrCgohWzpzY2FsZSAzMCVdKGZpZ3VyZXMvbGV2ZWxfcmVjb2RlLnBuZykKCgotLS0KCgoKaHR0cHM6Ly9qdWJhLmdpdGh1Yi5pby9xdWVzdGlvbnIvYXJ0aWNsZXMvcmVjb2RpbmdfYWRkaW5zLmh0bWwKCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18xLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzIucG5nKQoKCi0tLQoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMy5wbmcpCgoKLS0tCgojIEJhc2l0IHRhbsSxbWxhecSxY8SxIGlzdGF0aXN0aWtsZXIKCmBgYApzdW1tYXJ5KCkKYGBgCgpgYGAKbWVhbgpgYGAKCmBgYAptZWRpYW4KYGBgCgpgYGAKbWluCmBgYAoKYGBgCm1heApgYGAKCmBgYApzZApgYGAKCmBgYAp0YWJsZSgpCmBgYAoKLS0tCgoKYGBge3IgZGVzY3JpcHRpdmUsIGVjaG89VFJVRSwgaW5jbHVkZSA9IFRSVUV9CmxpYnJhcnkocmVhZHIpCmlyaXNkYXRhIDwtIHJlYWRfY3N2KCJkYXRhL2lyaXMuY3N2IikKCmptdjo6ZGVzY3JpcHRpdmVzKAogICAgZGF0YSA9IGlyaXNkYXRhLAogICAgdmFycyA9ICJTZXBhbC5MZW5ndGgiLAogICAgc3BsaXRCeSA9ICJTcGVjaWVzIiwKICAgIGZyZXEgPSBUUlVFLAogICAgaGlzdCA9IFRSVUUsCiAgICBkZW5zID0gVFJVRSwKICAgIGJhciA9IFRSVUUsCiAgICBib3ggPSBUUlVFLAogICAgdmlvbGluID0gVFJVRSwKICAgIGRvdCA9IFRSVUUsCiAgICBtb2RlID0gVFJVRSwKICAgIHN1bSA9IFRSVUUsCiAgICBzZCA9IFRSVUUsCiAgICB2YXJpYW5jZSA9IFRSVUUsCiAgICByYW5nZSA9IFRSVUUsCiAgICBzZSA9IFRSVUUsCiAgICBza2V3ID0gVFJVRSwKICAgIGt1cnQgPSBUUlVFLAogICAgcXVhcnQgPSBUUlVFLAogICAgcGNFcUdyID0gVFJVRSkKYGBgCgotLS0KCmBgYHtyIHNjYXR0ZXIsIGVjaG89VFJVRSwgaW5jbHVkZT1UUlVFfQojIGluc3RhbGwucGFja2FnZXMoInNjYXRyIikKc2NhdHI6OnNjYXQoCiAgICBkYXRhID0gaXJpc2RhdGEsCiAgICB4ID0gIlNlcGFsLkxlbmd0aCIsCiAgICB5ID0gIlNlcGFsLldpZHRoIiwKICAgIGdyb3VwID0gIlNwZWNpZXMiLAogICAgbWFyZyA9ICJkZW5zIiwKICAgIGxpbmUgPSAibGluZWFyIiwKICAgIHNlID0gVFJVRSkKYGBgCgotLS0KCiMjIHN1bW1hcnl0b29scwoKaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3N1bW1hcnl0b29scy92aWduZXR0ZXMvSW50cm9kdWN0aW9uLmh0bWwKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmxpYnJhcnkoc3VtbWFyeXRvb2xzKQpzdW1tYXJ5dG9vbHM6OmZyZXEoaXJpcyRTcGVjaWVzLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZnJlcShpcmlzJFNwZWNpZXMsIHJlcG9ydC5uYXMgPSBGQUxTRSwgc3R5bGUgPSAicm1hcmtkb3duIiwgaGVhZGluZ3MgPSBGQUxTRSkKYGBgCgoKLS0tCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2l0aCh0b2JhY2NvLCBwcmludChjdGFibGUoc21va2VyLCBkaXNlYXNlZCksIG1ldGhvZCA9ICdyZW5kZXInKSkKYGBgCgoKLS0tCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30Kd2l0aCh0b2JhY2NvLAogICAgIHByaW50KGN0YWJsZShzbW9rZXIsIGRpc2Vhc2VkLCBwcm9wID0gJ24nLCB0b3RhbHMgPSBGQUxTRSksCiAgICAgICAgICAgb21pdC5oZWFkaW5ncyA9IFRSVUUsIG1ldGhvZCA9ICJyZW5kZXIiKSkKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZGVzY3IoaXJpcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRlc2NyKGlyaXMsCiAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLAogICAgICB0cmFuc3Bvc2UgPSBUUlVFLAogICAgICBoZWFkaW5ncyA9IEZBTFNFLAogICAgICBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGRmU3VtbWFyeShpcmlzKSkKCmBgYAoKCiFbXShmaWd1cmVzL2Rmc3VtbWFyeS5wbmcpCgo8IS0tIC0tLSAtLT4KCjwhLS0gYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30gLS0+CjwhLS0gZGZTdW1tYXJ5KHRvYmFjY28sIC0tPgo8IS0tICAgICAgICAgICBwbGFpbi5hc2NpaSA9IEZBTFNFLCAtLT4KPCEtLSAgICAgICAgICAgc3R5bGUgPSAiZ3JpZCIpIC0tPgo8IS0tIGBgYCAtLT4KCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgRmlyc3Qgc2F2ZSB0aGUgcmVzdWx0cwppcmlzX3N0YXRzX2J5X3NwZWNpZXMgPC0gYnkoZGF0YSA9IGlyaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJQ0VTID0gaXJpcyRTcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gZGVzY3IsIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3NlID0gVFJVRSkKIyBUaGVuIHVzZSB2aWV3KCksIGxpa2Ugc286CnZpZXcoaXJpc19zdGF0c19ieV9zcGVjaWVzLCBtZXRob2QgPSAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgoKLS0tCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KIyB2aWV3KGlyaXNfc3RhdHNfYnlfc3BlY2llcykKYGBgCgohW10oZmlndXJlcy9EZXNjcmlwdGl2ZVN0YXRpc3RpY3MucG5nKQoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpkYXRhKHRvYmFjY28pICMgdG9iYWNjbyBpcyBhbiBleGFtcGxlIGRhdGFmcmFtZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZQpCTUlfYnlfYWdlIDwtIHdpdGgodG9iYWNjbywKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLCAgdHJhbnNwb3NlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKCnZpZXcoQk1JX2J5X2FnZSwgInBhbmRlciIsIHN0eWxlID0gInJtYXJrZG93biIsIG9taXQuaGVhZGluZ3MgPSBUUlVFKQpgYGAKCjwhLS0gLS0tIC0tPgoKPCEtLSBgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfSAtLT4KPCEtLSB0b2JhY2NvX3N1YnNldCA8LSB0b2JhY2NvWyAsYygiZ2VuZGVyIiwgImFnZS5nciIsICJzbW9rZXIiKV0gLS0+CjwhLS0gZnJlcV90YWJsZXMgPC0gbGFwcGx5KHRvYmFjY29fc3Vic2V0LCBmcmVxKSAtLT4KCjwhLS0gIyB2aWV3KGZyZXFfdGFibGVzLCBmb290bm90ZSA9IE5BLCBmaWxlID0gJ2ZyZXEtdGFibGVzLmh0bWwnKSAtLT4KPCEtLSBgYGAgLS0+CgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndoYXQuaXMoaXJpcykKYGBgCgo8IS0tIC0tLSAtLT4KCjwhLS0gYGBge3J9IC0tPgo8IS0tIGZyZXEodG9iYWNjbyRnZW5kZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gLS0tIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gcHJpbnQoZnJlcSh0b2JhY2NvJGdlbmRlciksIG1ldGhvZCA9ICdyZW5kZXInKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIC0tLSAtLT4KCjwhLS0gIyMgc2tpbXIgLS0+Cgo8IS0tIGBgYCAtLT4KPCEtLSBsaWJyYXJ5KHNraW1yKSAtLT4KPCEtLSBza2ltKGRmKSAtLT4KPCEtLSBgYGAgLS0+CgotLS0KCiMjIERhdGFFeHBsb3JlcgoKYGBgCmxpYnJhcnkoRGF0YUV4cGxvcmVyKQpEYXRhRXhwbG9yZXI6OmNyZWF0ZV9yZXBvcnQoZGYpCmBgYAoKClshW10oaHR0cHM6Ly9zdGF0aWMxLnNxdWFyZXNwYWNlLmNvbS9zdGF0aWMvNThlZWY4ODQ2YTQ5NjNlNDI5Njg3YTRkL3QvNWJkZmMyZmI0ZDdhOWMwNGVlNTBiN2FhLzE1NDEzOTExNjA3MDIvZGF0YUV4cGxvcmVyR2lmTGcuZ2lmP2Zvcm1hdD0xNTAwdyldKGh0dHBzOi8vd3d3LmxpdHRsZW1pc3NkYXRhLmNvbS9ibG9nL3NpbXBsZS1lZGEpCgoKCi0tLQoKIyMgaW5zcGVjdGRmCgpodHRwczovL2dpdGh1Yi5jb20vYWxhc3RhaXJydXNod29ydGgvaW5zcGVjdGRmCgoKLS0tCgojIyBHcmFmaWtsZXIKCmBgYHtyIGVjaG89VFJVRX0KIyBsaWJyYXJ5KGdncGxvdDIpCiMgbGlicmFyeShtb3NhaWMpCiMgbVBsb3QoaXJpc2RhdGEpCmBgYAoKPCEtLSAtLS0gLS0+CgoKPCEtLSBgYGB7ciwgcmVzdWx0cz0iYXNpcyJ9IC0tPgo8IS0tIGN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gLS0tIC0tPgoKCjwhLS0gYGBge3J9IC0tPgo8IS0tIHByaW50KGN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIpLCBtZXRob2QgPSAncmVuZGVyJykgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gLS0tIC0tPgoKYGBgCmRlc2NyKHRvYmFjY28sIHN0eWxlID0gJ3JtYXJrZG93bicpCgpwcmludChkZXNjcih0b2JhY2NvKSwgbWV0aG9kID0gJ3JlbmRlcicsIHRhYmxlLmNsYXNzZXMgPSAnc3Qtc21hbGwnKQoKZGZTdW1tYXJ5KHRvYmFjY28sIHN0eWxlID0gJ2dyaWQnLCBwbGFpbi5hc2NpaSA9IEZBTFNFKQoKcHJpbnQoZGZTdW1tYXJ5KHRvYmFjY28sIGdyYXBoLm1hZ25pZiA9IDAuNzUpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgotLS0KCkEgYmVnaW5uZXIga2l0IGZvciAjcnN0YXRzClRoZSBMYW5kc2NhcGUgb2YgUiBQYWNrYWdlcyBmb3IgQXV0b21hdGVkIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMKaHR0cHM6Ly9qb3VybmFsLnItcHJvamVjdC5vcmcvYXJjaGl2ZS8yMDE5L1JKLTIwMTktMDMzLwoKCkBhcnRpY2xle1JKLTIwMTktMDMzLAogIGF1dGhvciA9IHtNYXRldXN6IFN0YW5pYWsgYW5kIFByemVteXPFgmF3IEJpZWNla30sCiAgdGl0bGUgPSB7e1RoZSBMYW5kc2NhcGUgb2YgUiBQYWNrYWdlcyBmb3IgQXV0b21hdGVkIEV4cGxvcmF0b3J5IERhdGEKICAgICAgICAgIEFuYWx5c2lzfX0sCiAgeWVhciA9IHsyMDE5fSwKICBqb3VybmFsID0ge3tUaGUgUiBKb3VybmFsfX0sCiAgZG9pID0gezEwLjMyNjE0L1JKLTIwMTktMDMzfSwKICB1cmwgPSB7aHR0cHM6Ly9qb3VybmFsLnItcHJvamVjdC5vcmcvYXJjaGl2ZS8yMDE5L1JKLTIwMTktMDMzL2luZGV4Lmh0bWx9Cn0KCgoKLS0tCgoKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkhlcmUsIGJ1aWxkaW5nIHVwIGEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2dncGxvdDI/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3QyPC9hPiBhcyBzbG93bHkgYXMgcG9zc2libGUsIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+LiAgSW5jcmVtZW50YWwgYWRqdXN0bWVudHMuICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzdGVhY2hpbmdpZGVhcz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0c3RlYWNoaW5naWRlYXM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby9uVXVsUWw4YlBoIj5waWMudHdpdHRlci5jb20vblV1bFFsOGJQaDwvYT48L3A+Jm1kYXNoOyBHaW5hIFJleW5vbGRzIChARXZhTWFlUmV5KSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0V2YU1hZVJleS9zdGF0dXMvMTAyOTEwNDY1Njc2MzU3MjIyNj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTMsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgotLS0KCgpbIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kcmVhbVJzL2VzcXVpc3NlL21hc3Rlci9tYW4vZmlndXJlcy9lc3F1aXNzZS5naWYpXShodHRwczovL2dpdGh1Yi5jb20vZHJlYW1Scy9lc3F1aXNzZSkKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5EcmVhbWluZyBvZiBhIGZhbmN5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9Sc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNSc3RhdHM8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9nZ3Bsb3Q/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNnZ3Bsb3Q8L2E+IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9kYXRhdml6P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZGF0YXZpejwvYT4gYnV0IHN0aWxsIHNjYXJlZCBvZiB0eXBpbmcgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL2NvZGU/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNjb2RlPC9hPj8gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9fcHZpY3RvcnI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QF9wdmljdG9ycjwvYT4gZXNxdWlzc2UgcGFja2FnZSBoYXMgeW91IGNvdmVyZWQgPGEgaHJlZj0iaHR0cHM6Ly90LmNvLzF2SURYY1ZBQUYiPmh0dHBzOi8vdC5jby8xdklEWGNWQUFGPC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vUmxUa3B0bnJOdiI+cGljLnR3aXR0ZXIuY29tL1JsVGtwdG5yTnY8L2E+PC9wPiZtZGFzaDsgUmFkb3NsYXcgUGFuY3phayAoQFJQYW5jemFrKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1JQYW5jemFrL3N0YXR1cy8xMDQ3MDE5NTg4NjU4MDQwODMyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPk9jdG9iZXIgMiwgMjAxODwvYT48L2Jsb2NrcXVvdGU+CjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KCgoKPCEtLSAjIyBUYWJsb2xhciAtLT4KCgotLS0KCgojIEJhesSxIGFyYXnDvHpsZXIKCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9NeVJDb2Rlc0ZvckRhdGFBbmFseXNpcy9SLUFyYXl1emxlci5uYi5odG1sCgoKLS0tCgoKIyMgUmNtZHIKCmBgYApsaWJyYXJ5KFJjbWRyKQoKUmNtZHI6OkNvbW1hbmRlcigpCgpgYGAKCgotIEEgQ29tcGFyYXRpdmUgUmV2aWV3IG9mIHRoZSBSIENvbW1hbmRlciBHVUkgZm9yIFIKCmh0dHA6Ly9yNHN0YXRzLmNvbS9hcnRpY2xlcy9zb2Z0d2FyZS1yZXZpZXdzL3ItY29tbWFuZGVyLwoKCi0tLQoKIyMgamFtb3ZpCgpodHRwczovL3d3dy5qYW1vdmkub3JnLwoKPCEtLSAhWyFbXShodHRwczovL3d3dy5qYW1vdmkub3JnL2Fzc2V0cy9tYWluLXNjcmVlbnNob3QucG5nKV0oaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy8pIC0tPgoKCmh0dHBzOi8vYmxvZy5qYW1vdmkub3JnLzIwMTgvMDcvMzAvcmouaHRtbAoKPCEtLSAhWyFbXShodHRwczovL2Jsb2cuamFtb3ZpLm9yZy9hc3NldHMvaW1hZ2VzL3JqLnBuZyldKGh0dHBzOi8vYmxvZy5qYW1vdmkub3JnLzIwMTgvMDcvMzAvcmouaHRtbCkgLS0+CgotLS0KCiMgUiBuZXJlZGVuIMO2xJ9yZW5pbGlyCgpodHRwczovL3NiYWxjaS5naXRodWIuaW8vTXlSQ29kZXNGb3JEYXRhQW5hbHlzaXMvV2hlcmVUb0xlYXJuUi5uYi5odG1sCgotLS0KCiMgU29ucmFraSBLb251bGFyCgotIFJTdHVkaW8gaWxlIEdpdEh1YiBrdWxsYW7EsW3EsQotIFIgTWFya2Rvd24gdmUgUiBOb3RlYm9vayBpbGUgdGVrcmFybGFuYWJpbGlyIHJhcG9yCi0gSGlwb3RleiB0ZXN0bGVyaQoKCgotLS0tLQoKCiMgR2VyaSBCaWxkaXJpbQoKLSBHZXJpIGJpbGRpcmltIGnDp2luIHTEsWtsYXnEsW7EsXo6IF9bR2VyaSBiaWxkaXJpbSBmb3JtdV0oaHR0cHM6Ly9nb28uZ2wvZm9ybXMvWWpHWjVESGd0UGxSMVJuQjMpXwoKCi0tLQoKCjxzY3JpcHQgaWQ9ImRzcS1jb3VudC1zY3IiIHNyYz0iLy9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vY291bnQuanMiIGFzeW5jPjwvc2NyaXB0PgoKPGRpdiBpZD0iZGlzcXVzX3RocmVhZCI+PC9kaXY+CjxzY3JpcHQ+CgovKioKKiAgUkVDT01NRU5ERUQgQ09ORklHVVJBVElPTiBWQVJJQUJMRVM6IEVESVQgQU5EIFVOQ09NTUVOVCBUSEUgU0VDVElPTiBCRUxPVyBUTyBJTlNFUlQgRFlOQU1JQyBWQUxVRVMgRlJPTSBZT1VSIFBMQVRGT1JNIE9SIENNUy4KKiAgTEVBUk4gV0hZIERFRklOSU5HIFRIRVNFIFZBUklBQkxFUyBJUyBJTVBPUlRBTlQ6IGh0dHBzOi8vZGlzcXVzLmNvbS9hZG1pbi91bml2ZXJzYWxjb2RlLyNjb25maWd1cmF0aW9uLXZhcmlhYmxlcyovCi8qCnZhciBkaXNxdXNfY29uZmlnID0gZnVuY3Rpb24gKCkgewp0aGlzLnBhZ2UudXJsID0gUEFHRV9VUkw7ICAvLyBSZXBsYWNlIFBBR0VfVVJMIHdpdGggeW91ciBwYWdlJ3MgY2Fub25pY2FsIFVSTCB2YXJpYWJsZQp0aGlzLnBhZ2UuaWRlbnRpZmllciA9IFBBR0VfSURFTlRJRklFUjsgLy8gUmVwbGFjZSBQQUdFX0lERU5USUZJRVIgd2l0aCB5b3VyIHBhZ2UncyB1bmlxdWUgaWRlbnRpZmllciB2YXJpYWJsZQp9OwoqLwooZnVuY3Rpb24oKSB7IC8vIERPTidUIEVESVQgQkVMT1cgVEhJUyBMSU5FCnZhciBkID0gZG9jdW1lbnQsIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwpzLnNyYyA9ICdodHRwczovL2h0dHBzLXNiYWxjaS1naXRodWItaW8uZGlzcXVzLmNvbS9lbWJlZC5qcyc7CnMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKKGQuaGVhZCB8fCBkLmJvZHkpLmFwcGVuZENoaWxkKHMpOwp9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+CgoKLS0tCgoKPCEtLSBgYGAgLS0+CjwhLS0gIyBTYXZlIEZpbmFsIERhdGEgLS0+Cgo8IS0tIHNhdmVkIGRhdGEgYWZ0ZXIgYW5hbHlzaXMgdG8gYERhdGEtQWZ0ZXItQW5hbHlzaXMueGxzeGAuIC0tPgoKPCEtLSBzYXZlUkRTKG15ZGF0YSwgIkRhdGEtQWZ0ZXItQW5hbHlzaXMucmRzIikgLS0+Cgo8IS0tIHdyaXRleGw6OndyaXRlX3hsc3gobXlkYXRhLCAiRGF0YS1BZnRlci1BbmFseXNpcy54bHN4IikgLS0+Cgo8IS0tIGZpbGUuaW5mbygiRGF0YS1BZnRlci1BbmFseXNpcy54bHN4IikkY3RpbWUgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gLS0tIC0tPgoKCiMgTGlicmFyaWVzIFVzZWQKCmBgYHtyfQpjaXRhdGlvbigpCmBgYAoKYGBgCmNpdGF0aW9uKCJ0aWR5dmVyc2UiKQpjaXRhdGlvbigiZm9yZWlnbiIpCmNpdGF0aW9uKCJ0aWR5bG9nIikKY2l0YXRpb24oImphbml0b3IiKQpjaXRhdGlvbigiam12IikKY2l0YXRpb24oInRhbmdyYW0iKQpjaXRhdGlvbigiZmluYWxmaXQiKQpjaXRhdGlvbigic3VtbWFyeXRvb2xzIikKY2l0YXRpb24oImdnc3RhdHBsb3QiKQpjaXRhdGlvbigicmVhZHhsIikKYGBgCgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KY2l0YXRpb24oInRpZHl2ZXJzZSIpCmNpdGF0aW9uKCJmb3JlaWduIikKY2l0YXRpb24oInRpZHlsb2ciKQpjaXRhdGlvbigiamFuaXRvciIpCmNpdGF0aW9uKCJqbXYiKQpjaXRhdGlvbigidGFuZ3JhbSIpCmNpdGF0aW9uKCJmaW5hbGZpdCIpCmNpdGF0aW9uKCJzdW1tYXJ5dG9vbHMiKQpjaXRhdGlvbigiZ2dzdGF0cGxvdCIpCmNpdGF0aW9uKCJyZWFkeGwiKQpgYGAKCgo8IS0tIC0tLSAtLT4KCgo8IS0tIGBgYHtyLCByZXN1bHRzPSdhc2lzJ30gLS0+CjwhLS0gcmVwb3J0OjpjaXRlX3BhY2thZ2VzKHNlc3Npb24gPSBzZXNzaW9uSW5mbygpKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSAtLS0gLS0+CgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCi0tLQoKCiMgxLBsZXRpxZ9pbSAgCgpDb21wbGV0ZWQgb24gYHIgU3lzLnRpbWUoKWAuICAKClNlcmRhciBCYWxjaSwgTUQsIFBhdGhvbG9naXN0ICAKZHJzZXJkYXJiYWxjaUBnbWFpbC5jb20gIAoKaHR0cHM6Ly9ycHVicy5jb20vc2JhbGNpL0NWICAgCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby8gIApodHRwczovL2dpdGh1Yi5jb20vc2JhbGNpICAKaHR0cHM6Ly90d2l0dGVyLmNvbS9zZXJkYXJiYWxjaQoKLS0tCgpgYGB7cn0KQ29tbWl0TWVzc2FnZSA8LSBwYXN0ZSgidXBkYXRlZCBvbiAiLCBTeXMudGltZSgpLCBzZXAgPSAiIikKCndkIDwtIGdldHdkKCkKCmdpdENvbW1hbmQgPC0gcGFzdGUoImNkICIsIHdkLCAiIFxuIGdpdCBhZGQgLiBcbiBnaXQgY29tbWl0IC0tbWVzc2FnZSAnIiwgQ29tbWl0TWVzc2FnZSwgIicgXG4gZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBcbiIsIHNlcCA9ICIiKQoKc3lzdGVtKGNvbW1hbmQgPSBnaXRDb21tYW5kLCBpbnRlcm4gPSBUUlVFCikKCmBgYAoKCgoKCgoKCg==